package com.ktjy.order.config;

import com.alibaba.cloud.nacos.annotation.NacosConfigListener;
import jakarta.annotation.Resource;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.logging.LoggingSystem;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * NacosConfigListener Nacos配置刷新监听配置类
 *
 * @author LILIBO
 * @since 2025-06-06
 */
// @Component
public class NacosRefreshListener {

    @Resource
    private LoggingSystem loggingSystem;

    @NacosConfigListener(dataId = "cloud-service-common.yml", group = "cloud-common")
    public void onConfigChanged(String config) {
        // 解析配置并更新日志级别
        updateMyBatisLogLevel(config);
    }

    private void updateMyBatisLogLevel(String config) {
        System.out.println("------------- updateMyBatisLogLevel: ");
        // 从配置中提取日志级别
        String logLevel = extractLogLevel(config);
        System.out.println("------------- extractLogLevel: " + logLevel);
        if (logLevel != null) {
            loggingSystem.setLogLevel("com.baomidou.mybatisplus", LogLevel.valueOf(logLevel));
        }
    }

    /**
     * 从配置字符串中提取MyBatis-Plus的日志级别配置
     *
     * @param config Nacos配置中心获取的配置内容
     * @return 日志级别字符串，如果未找到则返回null
     */
    private String extractLogLevel(String config) {
        if (config == null || config.trim().isEmpty()) {
            return null;
        }
        // 解析配置格式，支持properties和yaml两种常见格式
        String logLevel = null;
        // 检查是否为yaml格式
        if (config.contains("mybatis-plus:") || config.contains("logging:")) {
            logLevel = extractFromYaml(config);
        }
        // 检查是否为properties格式
        else if (config.contains("mybatis-plus.configuration") || config.contains("logging.level")) {
            logLevel = extractFromProperties(config);
        }
        // 尝试通用匹配
        if (logLevel == null) {
            logLevel = tryGenericMatch(config);
        }
        return logLevel;
    }

    /**
     * 从YAML格式配置中提取日志级别
     */
    private String extractFromYaml(String config) {
        // 匹配 mybatis-plus 特定日志配置
        // 例如:
        // mybatis-plus:
        //   configuration:
        //     log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
        Pattern mpPattern = Pattern.compile("mybatis-plus:\\s*configuration:\\s*log-impl:\\s*(.+)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        Matcher mpMatcher = mpPattern.matcher(config);
        if (mpMatcher.find()) {
            return mpMatcher.group(1).trim();
        }
        // 匹配通用日志配置
        // 例如:
        // logging:
        //   level:
        //     com.baomidou.mybatisplus: DEBUG
        Pattern logPattern = Pattern.compile("logging:\\s*level:\\s*com\\.baomidou\\.mybatisplus:\\s*(.+)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        Matcher logMatcher = logPattern.matcher(config);
        if (logMatcher.find()) {
            return logMatcher.group(1).trim();
        }
        return null;
    }

    /**
     * 从properties格式配置中提取日志级别
     */
    private String extractFromProperties(String config) {
        // 匹配 mybatis-plus 特定日志配置
        // 例如: mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
        Pattern mpPattern = Pattern.compile("mybatis-plus\\.configuration\\.log-impl\\s*=\\s*(.+)", Pattern.CASE_INSENSITIVE);
        Matcher mpMatcher = mpPattern.matcher(config);
        if (mpMatcher.find()) {
            return mpMatcher.group(1).trim();
        }
        // 匹配通用日志配置
        // 例如: logging.level.com.baomidou.mybatisplus=DEBUG
        Pattern logPattern = Pattern.compile("logging\\.level\\.com\\.baomidou\\.mybatisplus\\s*=\\s*(.+)", Pattern.CASE_INSENSITIVE);
        Matcher logMatcher = logPattern.matcher(config);
        if (logMatcher.find()) {
            return logMatcher.group(1).trim();
        }
        return null;
    }

    /**
     * 尝试通用匹配方式提取日志级别
     */
    private String tryGenericMatch(String config) {
        // 查找 MyBatis-Plus 日志实现类配置
        // 如: log-impl: StdOutImpl 或 logImpl=StdOutImpl
        Pattern genericPattern = Pattern.compile("log\\s*-?\\s*impl\\s*[:=]\\s*([^\\s,]+)", Pattern.CASE_INSENSITIVE);
        Matcher matcher = genericPattern.matcher(config);
        if (matcher.find()) {
            return matcher.group(1).trim();
        }
        return null;
    }

}
